<?php
namespace Home\Controller;
use Think\Controller;
class WarningController extends ZMController {
	//每日中午12点开始执行预警计算
	private static $type=array(0,1,3,4,5);
	private static $typeName=array('感染性','损伤性','','化学性','药物性','病理性');
	/*
	warning
	0->连续二次出现本医疗机构医疗废物分类比前一日少一类。
	1->今日零时至前7日的日平均数比上月日平均值（即30天平均数）低60%，同时比上90天日平均数重量低40%。
	2->今日零时至前7日的日平均数比上月日平均值（即30天平均数）高60%，同时比上90天日平均数重量高40%。
	3->今日零时至前7日的日平均数比上月日平均值（即30天平均数）低80%，同时比上90天日平均数重量低40%。(科室)
	4->今日零时至前7日的日平均数比上月日平均值（即30天平均数）高80%，同时比上90天日平均数重量高40%。(科室)
	5->科室产生的医疗废物的时间与收集到暂存间的时间连续二次超过24小时
	*/
	/*public function _initialize(){
		if(session('?user')){
			$this->region=session('user.region');
		}
		else{
			exit(0);
		}
	}*/
	public function _initialize(){
		$this->type=self::$type;
		$this->typeName=self::$typeName;
	}
	public function warning(){//报警
		$Model=M()->db(1,'DB_CONFIG1');
		//$pdate=date('Y-m-d');
		//$where['pdate']=$pdate;
		$hid=null;
		$region=session('user.region');
		$hosp=R('Cust/hospital',array($hid,$region));//医院列表
		$hid=i_array_column($hosp,'hid');
		$where['hid']=array('in',$hid);
		$page = I('page');		
        $limit = I("limit");
		$start=($page-1)*$limit;
		$limit="$start,$limit";
		$count=$Model->table("ddwk_warning")->where($where)->count();
		$res=$Model->table("ddwk_warning")->where($where)->order("id desc")->limit($limit)->select();
		$typeName=$this->typeName;
		foreach($res as &$row){
			$hosp=R('Cust/hospital',array($row['hid']));
			$row['name']=$hosp[0]['name'];
			$flag=3;
			switch($row['warning']){
				case "连续二次出现本医疗机构医疗废物分类比前一日少一类":
					$row['warning']="连续二次出现本医疗机构医疗废物分类比前一日少一类";
					if(!empty($row['memo'])){
						$memo=explode('|',$row['memo']);
						foreach($memo as $v){
							$tname=explode(',',$v);
							$m='';
							foreach($tname as $t){
								$m.=','.$typeName[$t];
							}
							$m=ltrim($m,',');
							$d='';
							switch($flag){
								case 3:
									if(!empty($m)){
										$d.=',前日收集的医废类型为'.$m;
									}
									else{
										$d.='前日没有进行收集';
									}
									$flag-=1;
									break;
								case 2:
									if(!empty($m)){
										$d.=',而昨日为'.$m;
									}
									else{
										$d.='昨日没有进行收集';
									}
									$flag-=1;
									break;
								case 1:
									if(!empty($m)){
										$d.='当日为'.$m;
									}
									else{
										$d.='当日还未进行收集';
									}
									$flag-=1;
									break;
							}
							$row['memo']=ltrim($d,',');
							$row['warning'].=','.$row['memo'];
						}
					}
					break;
			}
		}
		$this->ajax($res,$count);
	}
	public function hospTypeWarning(){//连续二次出现本医疗机构医疗废物分类比前一日少一类。
		$hid=null;
		$region=999;
		$hosp=R('Cust/hospital',array($hid,$region));//医院列表
		$date1=date('Y-m-d');//当天
		$date2=date('Y-m-d',strtotime("-1 day"));
		$date3=date('Y-m-d',strtotime("-2 day"));
		$date=array($date3,$date2,$date1);//日期正序
		$warning="连续二次出现本医疗机构医疗废物分类比前一日少一类";
		foreach($hosp as $h){//医院
			$hid=$h['hid'];
			$arr=array();
			$type=array();
			foreach($date as $v){//日期
				if($v!=date('Y-m-d')){
					$t=$this->typeCount($v,$hid);
					$arr[]=count($t);
					$t=implode(',',$t);
					$type[]=$t;
				}
				else{
					$t=$this->nowTypeCount($v,$hid);
					$arr[]=count($t);
					$t=implode(',',$t);
					$type[]=$t;
				}
			}
			if(!empty($arr)){
				if($arr[0]>$arr[1]&&$arr[1]>$arr[2]){//医疗废物分类比前一日少一类
					$p=implode('|',$type);
					$this->addWarning($hid,$warning,$p);//新增预警记录
				}
			}
		}
	}
	public function hospCollectLowWarning(){//今日零时至前7日的日平均数比上月日平均值（即30天平均数）低60%，同时比上90天日平均数重量低40%。
		$yes=date('Y-m-d',strtotime("-1day"));//昨日
		$we=date('Y-m-d',strtotime("-7day"));//7天前
		//$mo=date('Y-m-d',strtotime("-30day"));//30天前
		$d = date('Y-m',strtotime("-1month"));
		$sd = $d.'-01';
		$ed = $d.'-30';
		$qu=date('Y-m-d',strtotime("-90day"));//90天前
		$hosp=$this->hospital();//要检查的医院列表
		foreach($hosp as $h){
			$hid=$h['hid'];
			$collect1=$this->collectSum($we,$yes,$hid);//7天
			$collect1=($collect1*100)/700;
			$collect2=$this->collectSum($sd,$ed,$hid);//30天
			$collect2=($collect2*100)/3000;
			$collect3=$this->collectSum($qu,$yes,$hid);//90天
			$collect3=($collect3*100)/9000;
			if($collect1<$collect2&&$collect1<$collect3&&$collect1/$collect2<0.6&&$collect1/$collect3<0.4){//低
				$warning="今日零时至前7日的日平均数比上月日平均值（即30天平均数）低60%，同时比上90天日平均数重量低40%";//预警类别
				$this->addWarning($hid,$warning);//新增预警记录
			}
			else if($collect1>$collect2&&$collect1>$collect3&&(($collect1/$collect2)-1)>0.6&&(($collect1/$collect3)-1)>0.4){//高
				$warning="今日零时至前7日的日平均数比上月日平均值（即30天平均数）高60%，同时比上90天日平均数重量高40%";//预警类别
				$this->addWarning($hid,$warning);//新增预警记录
			}
		}
	}
	public function hospital(){//统计的医院列表(运行半年后才开始计算)
		$date=date('Y-m-d',strtotime("-180day"));//半年
		$Model=M()->db(1,'DB_CONFIG1');
		$region=999;
		$where=array();
		if($region!=999){
			$where['region']=$region;
		}
		$where['operdate']=array('lt',$date);
		$where['hid']=array('neq',11);
		$res=$Model->table('ddwk_hospital')->where($where)->field("hid,name")->select();
		return $res;
	}
	public function collectSum($sdate,$edate,$hid){//时间段内收集量
		$Model=M()->db(1,'DB_CONFIG1');
		$res=$Model->query("select sum(weight0+weight1+weight3+weight4+weight5) as num from ddwk_collect_overday where pdate>='$sdate' and pdate<='$edate' and hid=$hid");
		if(!empty($res)){
			return $res[0]['num'];
		}
		else{
			return 0;
		}
	}
	public function nowTypeCount($date,$hid){//该日期医院收集类型(当日)
		$Model=M()->db(1,'DB_CONFIG1');
		$res=$Model->query("select sum(num_0) as num_0,sum(num_1) as num_1,sum(num_3) as num_3,sum(num_4) as num_4,sum(num_5) as num_5 from ddwk_collect where pdate='$date' and hid=$hid");
		$type=$this->type;
		$arr=array();
		foreach($type as $v){
			foreach($res as $row){
				if($row['num_'.$v]!=0){
					array_push($arr,$v);
				}
			}
		}
		return $arr;
	}
	public function typeCount($date,$hid){//该日期医院收集类型(非当日)
		$Model=M()->db(1,'DB_CONFIG1');
		$where['hid']=$hid;
		$where['pdate']=$date;
		$res=$Model->table('ddwk_collect_overday')->where($where)->find();
		$type=$this->type;
		$arr=array();
		if(!empty($res)){
			foreach($type as $v){
				if($res['weight'.$v]!='0.00'){
					array_push($arr,$v);
				}
			}
		}
		return $arr;
	}
	public function addWarning($hid,$warning,$p=NULL){//新增预警记录
		$Model=M()->db(1,'DB_CONFIG1');
		$data['hid']=$hid;
		$data['warning']=$warning;
		$data['memo']=$p;
		$data['pdate']=date('Y-m-d');
		$res=$Model->table('ddwk_warning')->add($data);
		if($res!==false){
			return true;
		}
		else{
			return false;
		}
	}
}
?>
